package br.com.equus.bean;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.model.SelectItem;

import org.hibernate.Hibernate;
import org.primefaces.model.LazyDataModel;
import org.primefaces.model.SortOrder;

import br.com.arquitetura.bean.PaginableBean;
import br.com.arquitetura.excecao.ExcecaoUtil;
import br.com.arquitetura.util.ComboUtil;
import br.com.equus.dto.PesquisarAnimalDTO;
import br.com.equus.entidade.Animal;
import br.com.equus.entidade.Proprietario;
import br.com.equus.entidade.Raca;
import br.com.equus.entidade.TipoAnimal;
import br.com.equus.entidade.TipoProprietario;
import br.com.equus.service.AnimalService;

@ManagedBean(name = "pesquisarAnimalBean")
@ViewScoped
public class PesquisarAnimalBean extends PaginableBean<Animal> {

	private static final long serialVersionUID = 1L;

	@ManagedProperty(value = "#{animalService}")
	private AnimalService animalService;

	private List<SelectItem> listaSexo;
	private List<SelectItem> listaRaca;
	private List<SelectItem> listaTipoAnimal;

	private Animal animalSelect;

	private String pagina;

	private PesquisarAnimalDTO dto;

	public PesquisarAnimalBean() {
		animalSelect = new Animal();
		dto = new PesquisarAnimalDTO();

	}

	@SuppressWarnings("unchecked")
	@PostConstruct
	public void carregarListas() {
		try {
			if (listaSexo == null || listaSexo.isEmpty()) {
				listaSexo = new ArrayList<SelectItem>();
				listaSexo.add(new SelectItem("", "Selecione"));
				listaSexo.add(new SelectItem("M", "Macho"));
				listaSexo.add(new SelectItem("F", "Fêmea"));
			}

			listaRaca = new ArrayList<SelectItem>();
			listaRaca.addAll(ComboUtil.getItens(universalManager.listBy(new Raca(true))));

			listaTipoAnimal = new ArrayList<SelectItem>();
			listaTipoAnimal.addAll(ComboUtil.getItens(universalManager.listBy(new TipoAnimal(true))));
		} catch (Exception e) {
			ExcecaoUtil.tratarExcecao(e);
		}

	}

	public void pesquisar() {
		try {
			getLazyDataModel();
		} catch (Exception e) {
			ExcecaoUtil.tratarExcecao(e);
		}
	}

	@SuppressWarnings("unchecked")
	public List<Proprietario> completeProprietario(String query) {
		List<Proprietario> sugestoes = new ArrayList<Proprietario>();
		Proprietario a = new Proprietario();
		a.setTipoProprietario(new TipoProprietario(TipoProprietario.PROPRIETARIO));
		a.setNome(query);
		try {
			sugestoes = this.universalManager.listBy(a, true);
		} catch (Exception e) {
			ExcecaoUtil.tratarExcecao(e);
		}
		return sugestoes;
	}

	public List<Proprietario> completeCriador(String query) {
		List<Proprietario> sugestoes = new ArrayList<Proprietario>();
		Proprietario a = new Proprietario();
		a.setTipoProprietario(new TipoProprietario(TipoProprietario.CRIADOR));
		a.setNome(query);
		try {
			sugestoes = this.universalManager.listBy(a, true);
		} catch (Exception e) {
			ExcecaoUtil.tratarExcecao(e);
		}
		return sugestoes;
	}

	public void loadSelect() {
		try {
			animalSelect = (Animal) universalManager.get(Animal.class, animalSelect.getId());
			Hibernate.initialize(animalSelect);
			Hibernate.initialize(animalSelect.getImagens());
			animalSelect.getListaUrls();
		} catch (Exception e) {
			ExcecaoUtil.tratarExcecao(e);
		}
	}

	@SuppressWarnings("unchecked")
	public String encaminhar() {
		try {
			getSessionMap().put("idAnimal", animalSelect.getId());

			if (pagina.equalsIgnoreCase("animal.jsf")) {
				getSessionMap().put("mostrarVoltar", true);

			}
		} catch (Exception e) {
			ExcecaoUtil.tratarExcecao(e);
		}
		return redirect(pagina);

	}

	public LazyDataModel<Animal> getLazyDataModel() {
		if (lazyDataModel == null)

			lazyDataModel = new LazyDataModel<Animal>() {

				private static final long serialVersionUID = 2595093445602418759L;

				@SuppressWarnings("unchecked")
				@Override
				public List<Animal> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map filters) {
					// Reduzindo o contador depois de filtrado
					try {
						int rowCount = animalService.countAnimal(dto).intValue();
						lazyDataModel.setRowCount(rowCount);
						List<Animal> list = animalService.paginateAnimal(first, pageSize, dto);

						return list;
					} catch (Exception e) {
						ExcecaoUtil.tratarExcecao(e);
					}
					return null;
				}
			};
		return lazyDataModel;
	}

	@Override
	public void verificarAcesso() {
		// TODO Auto-generated method stub

	}

	@Override
	public Animal createModel() {
		return new Animal();
	}

	@Override
	public String getQualifiedName() {
		return "Animal";
	}

	@Override
	public boolean isFeminino() {
		return false;
	}

	@Override
	public Map<String, String> getFilters() {
		return null;
	}

	public AnimalService getAnimalService() {
		return animalService;
	}

	public void setAnimalService(AnimalService animalService) {
		this.animalService = animalService;
	}

	public List<SelectItem> getListaSexo() {
		return listaSexo;
	}

	public void setListaSexo(List<SelectItem> listaSexo) {
		this.listaSexo = listaSexo;
	}

	public List<SelectItem> getListaRaca() {
		return listaRaca;
	}

	public void setListaRaca(List<SelectItem> listaRaca) {
		this.listaRaca = listaRaca;
	}

	public static long getSerialversionuid() {
		return serialVersionUID;
	}

	public Animal getAnimalSelect() {
		return animalSelect;
	}

	public void setAnimalSelect(Animal animalSelect) {
		this.animalSelect = animalSelect;
	}

	public String getPagina() {
		return pagina;
	}

	public void setPagina(String pagina) {
		this.pagina = pagina;
	}

	public PesquisarAnimalDTO getDto() {
		return dto;
	}

	public void setDto(PesquisarAnimalDTO dto) {
		this.dto = dto;
	}

	public List<SelectItem> getListaTipoAnimal() {
		return listaTipoAnimal;
	}

	public void setListaTipoAnimal(List<SelectItem> listaTipoAnimal) {
		this.listaTipoAnimal = listaTipoAnimal;
	}

}
